var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
// 引入multer
const multer = require("multer")
// 部署放头像的文件
const upload = multer({ dest: "public/uploads/" })
// 引入session 模块
const session = require("express-session");
// 引入  connect-mongo 这个是存储cookie 到mongodb 中自动删除和更新
const MongoStore = require("connect-mongo")


var indexRouter = require('./routes/index');
var apiRouter = require('./routes/api');
const loginRouter = require("./routes/login")

var app = express();

// 配置session 
app.use(session({
  name: "mySession",
  secret: "session secret",//配置秘钥
  resave: true,//重新设置cookie 值可以重新计时
  saveUninitialized: true,//初始化session  一开始就给服务器发送一个cookie 
  cookie: {
    maxAge: 1000 * 60 * 60, //设置过期时间
    secure: false,//是否在安全模式下就是https 下访问
  },
  rolling: true,//表示在超时前刷新就会从新计时cookie 为false 表示超时前刷新多少次都会按照第一次开始计时
  // 配置cookie 存入到MongoDB 中
  store: MongoStore.create({
    mongoUrl: 'mongodb://127.0.0.1:27017/my_session',//链接数据库
    ttl: 1000 * 60 * 60, //设置过期时间
  })
}))

// 全局拦截session 
app.use((req, res, next) => {
  if (req.url.includes("login")) return next()
  // 登录成功了就给session挂载一个user属性
  if (req.session.user) {
    // 如果有就放行重新设置session 值
    req.session.myDate = Date.now();
    next()
  } else {
    // 因为我是又有后端渲染又有前端的请求所以我们要判断
    req.url.includes("api") ?
      // 如果是api 就send  ok：1
      res.status(401).send({ ok: 1 })
      // 如果是 页面的请求就跳到login 页面
      : res.redirect("/login")
  }
})

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');


app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/', indexRouter);
app.use('/api', apiRouter);
// 处理文件上传数据
app.use("/login", upload.single("avatar"), loginRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
